/**
* @version 1.0
* @package FACTURAPYMES.
* @author Jorge Washington Mueses Cevallos.
* @copyright Copyright (C) 2010 por Jorge Mueses. Todos los derechos reservados.
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL.
* FACTURAPYMES! es un software de libre distribución, que puede ser
* copiado y distribuido bajo los términos de la Licencia Pública
* General GNU, de acuerdo con la publicada por la Free Software
* Foundation, versión 2 de la licencia o cualquier versión posterior.
*/

package jm.nom;

import java.io.*;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.*;
import javax.servlet.http.*;
import jm.fac.clas.DocumentoBanco;
import jm.web.Addons;
import jm.web.Archivo;
import jm.web.Matriz;

/**
 *
 * @author Jorge
 */
public class ProcesaArchivoBiometrico extends HttpServlet {
    private String _ip = null;
    private int _puerto = 5432;
    private String _db = null;
    private String _dir = null;

    public void init(ServletConfig config) throws ServletException
    {
        this._ip = config.getServletContext().getInitParameter("_IP");
        this._puerto = Integer.parseInt(config.getServletContext().getInitParameter("_PUERTO"));
        this._db = config.getServletContext().getInitParameter("_DB");
        this._dir = config.getServletContext().getInitParameter("_DIR");
    }

    /**
    * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
    * @param request servlet request
    * @param response servlet response
    */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        HttpSession sesion = request.getSession(true);
        String usuario = (String)sesion.getAttribute("usuario");
        String clave = (String)sesion.getAttribute("clave");
        
        response.setContentType("text/html;charset=UTF-8");
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Expires", "Mon, 01 Jan 2001 00:00:01 GMT");
        response.setHeader("Cache-Control", "no-store");
        response.setHeader("Cache-Control", "must-revalidate");
        response.setHeader("Cache-Control", "no-cache");
        PrintWriter out = response.getWriter();

        //this._dir = "/home/desarrollo/";

        Archivo archivo = new Archivo(this._ip, this._puerto, this._db, usuario, clave);
        archivo.setDirectorio(this._dir);
        try {
            String r = "<script language='javascript' type='text/javascript'>window.top.window.fac_finTransferencia('Ha ocurrido un error en el proceso de subida del archivo.', '');</script>";
            if(archivo.subir(request, 30, new String[]{"text/plain", "text/csv", "application/vnd.ms-excel"} )){
                int err = 1;
                String msg = "Ha ocurrido un error en el procesamiento de los datos del archivo. Por favor, vuelva a intentarlo más tarde o " +
                    "contáctese con el administrador del sistema para mayor información.";
                DocumentoBanco objDocBanco = new DocumentoBanco(this._ip, this._puerto, this._db, usuario, clave);
                try{
                    List sql = new ArrayList();
                    File file = archivo.getArchivo();
                    String linea = "";
                    
                    BufferedReader buffer_tmp = new BufferedReader(new InputStreamReader(new FileInputStream(file), "8859_1"));
                    List sql_tmp = new ArrayList();
                    sql_tmp.add("delete from tbl_empleado_asistencia_tmp;");
                    while ((linea = buffer_tmp.readLine()) != null) {
                        linea = linea.replace("\"", "");
                        String cols[] = linea.split(";", 26);
                        if(cols[0].compareTo("AC-No.")!=0 && cols[0].compareTo("")!=0){
                            sql_tmp.add("insert into tbl_empleado_asistencia_tmp(ac_no, dia, horario) values('"+cols[0]+"', '"+cols[2]+"', '"+cols[3]+"');");
                        }
                    }
                    objDocBanco.transacciones(sql_tmp);
                    buffer_tmp.close();
                    
                    
                    ResultSet rs = objDocBanco.consulta("select T.ac_no, todatesql(T.dia), T.horario from tbl_empleado_asistencia as A, tbl_empleado_asistencia_tmp as T where A.ac_no=T.ac_no and A.dia=T.dia and A.horario=T.horario");
                    String mat[][] = Matriz.ResultSetAMatriz(rs);
                    
                    
                    BufferedReader buffer = new BufferedReader(new InputStreamReader(new FileInputStream(file), "8859_1"));
                    while ((linea = buffer.readLine()) != null) {
                        linea = linea.replace("\"", "");
                        String cols[] = linea.split(";", 26);
                        if(cols[0].compareTo("AC-No.")!=0 && cols[0].compareTo("")!=0){
                            if( this.enMatriz(mat, cols[0], cols[2], cols[3]) == -1 ){
                                sql.add("insert into tbl_empleado_asistencia(ac_no, nombre_biometrico, dia, horario, hora_ent, hora_sal, marc_ent, marc_sal, normal, tiemp_real, "
                                + "tardanza, salida_temprano, falta, hora_extra, tiempo_trabajado, excepcion, calc_ent, calc_sal, departamento_biometrico, n_dias, "
                                + "fin_semana, feriado, tiem_asist, num_dia_ot, fin_semana_ot, feriado_ot) "
                                + "values('"+cols[0]+"', '"+cols[1]+"', '"+cols[2]+"', '"+cols[3]+"', "+(cols[4].compareTo("")!=0 ? "'"+cols[4]+"'" : "NULL")+
                                ", "+(cols[5].compareTo("")!=0 ? "'"+cols[5]+"'" : "NULL")+", "+(cols[6].compareTo("")!=0 ? "'"+cols[6]+"'" : "NULL")+", "+
                                (cols[7].compareTo("")!=0 ? "'"+cols[7]+"'" : "NULL")+", "+(cols[8].compareTo("")!=0 ? cols[8].replaceAll(",", ".") : "NULL")+
                                ", "+(cols[9].compareTo("")!=0 ? cols[9] : "NULL")+", "+(cols[10].compareTo("")!=0 ? "'"+cols[10]+"'" : "NULL")+", "+
                                (cols[11].compareTo("")!=0 ? "'"+cols[11]+"'" : "NULL")+", '"+cols[12]+"', '"+cols[13]+"', "+
                                (cols[14].compareTo("")!=0 ? "'"+cols[14]+"'" : "NULL")+", '"+cols[15]+"', '"+cols[16]+"', '"+cols[17]+"', '"+cols[18]+
                                "', '"+cols[19]+"', '"+cols[20]+"', '"+cols[21]+"', "+(cols[22].compareTo("")!=0 ? "'"+cols[22]+"'" : "NULL")+
                                ", "+(cols[23].compareTo("")!=0 ? cols[23] : "NULL")+", '"+cols[24]+"', '"+cols[25]+"');");
                            }
                        }
                    }
                    if(objDocBanco.transacciones(sql)){
                        err = 0;
                        msg = "Subida del archivo del biométrico realizada satisfactoriamente.";
                    }else{
                        err = 1;
                        msg = objDocBanco.getError();
                    }
                    buffer.close();
                }catch(Exception e){
                    err = 1;
                    msg = e.getMessage();
                }finally{
                    objDocBanco.cerrar();
                }
                r = "<script language='javascript' type='text/javascript'>window.top.window.fac_finTransferencia("+err+", '"+msg.replace("\n", "") +"');</script>";
            }else{
                r = "<script language='javascript' type='text/javascript'>window.top.window.fac_finTransferencia(1, '"+archivo.getError()+"');</script>";
            }
            out.print(r);
        }catch(Exception e) {
            e.printStackTrace();
        } finally {
            archivo.cerrar();
            out.close();
        }
    }
    
    
    public int enMatriz(String mat[][], String clave0, String clave1, String clave2)
    {
        int p=-1;
        for(int i=0; i<mat.length; i++){
            if(mat[i][0].compareTo(clave0)==0 && mat[i][1].compareTo(clave1)==0 && mat[i][2].compareTo(clave2)==0){
                p = i;
                break;
            }
        }
        return p;
    }
    
    
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
    * Handles the HTTP <code>GET</code> method.
    * @param request servlet request
    * @param response servlet response
    */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
    * Handles the HTTP <code>POST</code> method.
    * @param request servlet request
    * @param response servlet response
    */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
    * Returns a short description of the servlet.
    */
    public String getServletInfo() {
        return "Short description";
    }
    // </editor-fold>
}
